HTTP 请求头结构

HTTP request 报文结构是怎样的

  1. 首行是Request-Line包括:请求方法请求 URI协议版本CRLF
  2. 首行之后是若干行请求头,包括general-headerrequest-header或者entity-header,每个一行以 CRLF 结束
  3. 请求头和消息实体之间有一个CRLF 分隔
  4. 根据实际请求需要可能包含一个消息实体

请求报文有 4 部分组成:

  • 请求行 请求行包括:请求方法字段、URL 字段、HTTP 协议版本字段。它们用空格分隔。例如,GET /index.html HTTP/1.1。
    • 请求类型
    • 要访问的资源
    • HTTP 协议版本号
  • 请求头 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔
    • 用来说明服务器要使用的附加信息(一些键值对)
    • 例如:User-Agent、 Accept、Content-Type、Connection
  • 空行
    • 分割请求头与请求体
  • 请求体 请求体: post put 等请求携带的数据
    • 可以添加任意的其他数据

HTTP response 报文结构是怎样的

  1. 首行是状态行包括:HTTP 版本,状态码,状态描述,后面跟一个 CRLF (回车换行)
  2. 首行之后是若干行响应头,包括:通用头部,响应头部,实体头部
  3. 响应头部和响应实体之间用一个 CRLF 空行分隔
  4. 最后是一个可能的消息实体

请求报文有 4 部分组成:

  • 状态行 由协议版本,状态码和状态码的原因短语组成,例如 HTTP/1.1 200 OK。
    • 状态码
    • 状态消息
    • HTTP 协议版本号
  • 消息报头 响应部首组成
    • 说明客户端要使用的一些附加信息
    • 如:Content-Type、charset、响应的时间
  • 空行
  • 响应正文 服务器响应的数据
    • 返回给客户端的文本信息

HTTP 首部

有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

各种首部字段及其含义如下(不需要全记,仅供查阅):

1. 通用首部字段

首部字段名说明
Cache-Control控制缓存的行为
Connection控制不再转发给代理的首部字段、管理持久连接
Date创建报文的日期时间
Pragma报文指令
Trailer报文末端的首部一览
Transfer-Encoding指定报文主体的传输编码方式
Upgrade升级为其他协议
Via代理服务器的相关信息
Warning错误通知

2. 请求首部字段

首部字段名说明
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的内容编码
Accept-Language优先的语言(自然语言)
AuthorizationWeb 认证信息
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host请求资源所在服务器
If-Match比较实体标记(ETag)
If-Modified-Since比较资源的更新时间
If-None-Match比较实体标记(与 If-Match 相反)
If-Range资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since比较资源的更新时间(与 If-Modified-Since 相反)
Max-Forwards最大传输逐跳数
Proxy-Authorization代理服务器要求客户端的认证信息
Range实体的字节范围请求
Referer对请求中 URI 的原始获取方
TE传输编码的优先级
User-AgentHTTP 客户端程序的信息

3. 响应首部字段

首部字段名说明
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location令客户端重定向至指定 URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP 服务器的安装信息
Vary代理服务器缓存的管理信息
WWW-Authenticate服务器对客户端的认证信息

4. 实体首部字段

首部字段名说明
Allow资源可支持的 HTTP 方法
Content-Encoding实体主体适用的编码方式
Content-Language实体主体的自然语言
Content-Length实体主体的大小
Content-Location替代对应资源的 URI
Content-MD5实体主体的报文摘要
Content-Range实体主体的位置范围
Content-Type实体主体的媒体类型
Expires实体主体过期的日期时间
Last-Modified资源的最后修改日期时间

HTTP 头部信息

每一个 http 请求和响应都会带有响应的头部信息,XHR 对象提供了操作请求头部和响应头部信息的方法。

默认情况下,发送 ajax 请求时,还会发送下列头部信息:

  • Accept: 浏览器能够显示的字符集
  • Accept-Charset: 浏览器能够显示的字符集
  • Accept-Encoding: 浏览器能够处理的压缩编码
  • Accept-Language: 浏览器当前设置的语言
  • Connection: 浏览器与服务器之间的连接类型(keep-alive)
  • Cookie: 当前页面设置的任何 cookie
  • Host: 发出请求的页面所在域
  • Referer: 发出请求的页面的 URL
  • User-Agent: 浏览器的用户代理字段(跟 window.navigator.userAgent 值是一样的)
  • :method: http 请求方法类型 GET/POST...

不同的浏览器实际发送的头部内容会有所不同,但是上面列出的信息基本上所有的浏览器都是会发送的。

原生操作 http 请求头部的方法:

  • .setRequestHeader("name","value")
  • .getResponseHeader('name')
  • .getAllResponseHeaders()

特殊的一些头部字段:

  • x-requested-with: 用来判断一个请求时传统的 http 请求还是 ajax 请求。XMLHttpRequest 表示 ajax 请求,例如 axios 中将全局的请求都声明为 ajax 请求。

事实上在服务端判断 request 来自 ajax 请求(异步)还是传统请求(同步)是通过判断请求中是否带有x-requested-with 属性,并且其值是否是XMLHttpRequest。 如果 request.getHeader("X-Requested-With") 的值为 XMLHttpRequest,则为 Ajax 异步请求。为 null,则为传统同步请求。

Last Updated:
Contributors: yiliang114